home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / basic / 555.zip / 555.BAS next >
BASIC Source File  |  1987-01-18  |  8KB  |  196 lines

  1. 10 ' 555 OSCILLATOR DESIGN
  2. 20 '
  3. 30 ' Michael A. Covington
  4. 40 ' 5339-14 North Rosemead Boulevard
  5. 50 ' San Gabriel, CA 91776
  6. 60 '
  7. 70 ' 24 July 1983
  8. 80 '
  9. 110 SCREEN 0,0,0 : WIDTH 80 : CLS : KEY OFF
  10. 120 LOCATE 10,29:  PRINT "555 OSCILLATOR DESIGN"
  11. 130 LOCATE 13,29:  PRINT "         by          "
  12. 140 LOCATE 16,29:  PRINT " Michael A. Covington"
  13. 150 LOCATE 25,26: PRINT "(Press any key to continue)";
  14. 160 IF INKEY$="" THEN 160
  15. 162 CLS: LOCATE  5,1 : PRINT,"This program helps you design astable multivi-"
  16. 164 PRINT,"brator circuits using the popular type 555 timer IC." : PRINT
  17. 166 PRINT,"The circuit diagram is given on the screen and you"
  18. 168 PRINT,"fill in values for the components; the frequency, "
  19. 170 PRINT,"period, on time, off time, and duty cycle are computed"
  20. 172 PRINT,"for you.  You can then change values if you wish."
  21. 174 PRINT
  22. 176 PRINT,"If you have an IBM Graphics Printer or a graphics"
  23. 178 PRINT,"screen dump program for your printer, you can get"
  24. 180 PRINT,"a hard copy of the circuit and its parameters at"
  25. 182 PRINT,"any time.
  26. 184 LOCATE 25,26: PRINT "(Press any key to continue)";
  27. 186 IF INKEY$="" THEN 186
  28. 200 REM  Draw diagram of 555 astable oscillator
  29. 205 ' outer boundaries of wiring
  30. 210 CLS : KEY OFF
  31. 220 LOCATE 1,12 : PRINT STRING$(42,196);
  32. 230 LOCATE 22,12 : PRINT STRING$(42,196);
  33. 240 FOR I=1 TO 22 : LOCATE I,12 : PRINT CHR$(179); : NEXT
  34. 242 LOCATE 1,12 : PRINT CHR$(218);
  35. 244 LOCATE 22,12 : PRINT CHR$(192);
  36. 248 ' outline of 555 itself
  37. 250 LOCATE 5,22 : PRINT STRING$(21,205);
  38. 260 LOCATE 18,22 : PRINT STRING$(21,205);
  39. 270 FOR I=5 TO 18 : LOCATE I,22 : PRINT CHR$(186); : NEXT
  40. 280 FOR I=5 TO 18 : LOCATE I,42 : PRINT CHR$(186); : NEXT
  41. 290 LOCATE 5,22 : PRINT CHR$(201);
  42. 300 LOCATE 5,42 : PRINT CHR$(187);
  43. 310 LOCATE 18,22 : PRINT CHR$(200);
  44. 320 LOCATE 18,42 : PRINT CHR$(188);
  45. 325 ' resistor
  46. 330 LOCATE 3,11 : PRINT CHR$(218);CHR$(193);CHR$(191);
  47. 340 FOR I=4 TO 5: LOCATE I,11 : PRINT CHR$(179); " "; CHR$(179); : NEXT
  48. 350 LOCATE 6,11 : PRINT CHR$(192);CHR$(194);CHR$(217);
  49. 360 ' resistor
  50. 370 LOCATE 9,11 : PRINT CHR$(218);CHR$(193);CHR$(191);
  51. 380 FOR I=10 TO 11 : LOCATE I,11 : PRINT CHR$(179);" ";CHR$(179); : NEXT
  52. 390 LOCATE 12,11 : PRINT CHR$(192);CHR$(194);CHR$(217)
  53. 400 ' capacitor
  54. 410 LOCATE 18,11 : PRINT CHR$(196);CHR$(193);CHR$(196);
  55. 420 LOCATE 19,11 : PRINT CHR$(196);CHR$(194);CHR$(196);
  56. 430 ' connect pin 1
  57. 440 LOCATE 17,32 : PRINT "1";
  58. 450 LOCATE 18,32 : PRINT CHR$(209);
  59. 460 FOR I=19 TO 21 : LOCATE I,32 : PRINT CHR$(179); : NEXT
  60. 470 LOCATE 22,32 : PRINT CHR$(193);
  61. 480 ' pin 2
  62. 490 LOCATE 16,12 : PRINT CHR$(195);STRING$(9,196);CHR$(182);"2";
  63. 500 ' pin 6
  64. 510 LOCATE 14,12 : PRINT CHR$(195);STRING$(9,196);CHR$(182);"6";
  65. 520 ' pin 7
  66. 530 LOCATE 8,12 : PRINT CHR$(195);STRING$(9,196);CHR$(182);"7";
  67. 540 ' pin 8
  68. 550 LOCATE 1,30 : PRINT CHR$(194);
  69. 560 FOR I=2 TO 4 : LOCATE I,30 : PRINT CHR$(179); : NEXT
  70. 570 LOCATE 5,30 : PRINT CHR$(207);
  71. 575 LOCATE 6,30 : PRINT "8";
  72. 580 ' pin 4
  73. 590 LOCATE 1,34 : PRINT CHR$(194);
  74. 600 FOR I=2 TO 4 : LOCATE I,34 : PRINT CHR$(179); : NEXT
  75. 610 LOCATE 5,34 : PRINT CHR$(207);
  76. 620 LOCATE 6,34 : PRINT "4";
  77. 630 ' pin 3
  78. 640 LOCATE  9,41 : PRINT "3";CHR$(199);STRING$(11,196);
  79. 650 ' various labels
  80. 660 LOCATE 10,30 : COLOR 0,7 : PRINT " 555 ";: COLOR 7,0
  81. 670 LOCATE 1,55 : PRINT "V+ (5-15v)";
  82. 680 LOCATE 9,55 : PRINT "Output";
  83. 690 LOCATE 22,55 : PRINT "V-";
  84. 700 LOCATE 4, 1 : PRINT "R1";
  85. 710 LOCATE 10, 1 : PRINT "R2";
  86. 720 LOCATE 18,1: PRINT "C";
  87. 800 REM  Get values and do calculations
  88. 805 LOCATE 25,1 : PRINT STRING$(79," ");
  89. 810 IF R1*R2*C <> 0 THEN LOCATE 25,40: PRINT "(Press RETURN to leave unchanged)";
  90. 812 '  Get value of R1
  91. 815 LOCATE 25,1 : PRINT STRING$(39," ");
  92. 817 IF R1>0 THEN LOCATE 25,10 : PRINT R1;
  93. 820 LOCATE 25,1 : PRINT "R1 ("+CHR$(234)+")  "; : INPUT;RESP
  94. 830 IF RESP>0 THEN R1=RESP
  95. 831 ' Verify that R1 is within safe range
  96. 832 IF R1>999 THEN 835
  97. 833 BEEP : LOCATE 24,1 : PRINT "R1 should normally be > 1000 ";CHR$(234);" to protect the discharge transistor.";
  98. 834 GOTO 812
  99. 835 LOCATE 24,1 : PRINT STRING$(79," ");  ' Clear error msg. if any
  100. 839 LOCATE 5,1 : PRINT STRING$(10," ");CHR$(179);" ";CHR$(179);"     ";
  101. 840 LOCATE 5,1 : PRINT R1;CHR$(234);
  102. 842 ' Get value of R2
  103. 845 LOCATE 25,1 : PRINT STRING$(39," ");
  104. 847 IF R2>0 THEN LOCATE 25,10 : PRINT R2;
  105. 850 LOCATE 25,1 : PRINT "R2 (";CHR$(234);")  "; : INPUT;RESP
  106. 860 IF RESP>0 THEN R2=RESP
  107. 869 LOCATE 11,1 : PRINT STRING$(10," ");CHR$(179);" ";CHR$(179);"     ";
  108. 870 LOCATE 11,1 : PRINT R2;CHR$(234);
  109. 872 ' Get value of C
  110. 875 LOCATE 25,1 : PRINT STRING$(39," ");
  111. 877 IF C>0 THEN LOCATE 25,10 : PRINT C;
  112. 880 LOCATE 25,1 : PRINT "C (";CHR$(230);"F)  "; : INPUT;RESP
  113. 890 IF RESP>0 THEN C=RESP
  114. 899 LOCATE 19,1 : PRINT STRING$(10," ");CHR$(196);CHR$(194);CHR$(196);"     ";
  115. 900 LOCATE 19,1 : PRINT C;CHR$(230);"F";
  116. 1000 ' Calculate output frequency, period, and duty cycle
  117. 1010 TH =  693 * (R1+R2) * (C/1000000!)   ' c is in microfarads
  118. 1020 TL =  693 * R2 * (C/1000000!)
  119. 1030 PERIOD = TH+TL
  120. 1031 FREQ = 1000 / PERIOD   ' times are in milliseconds
  121. 1032 IF TH+TL < .001 THEN UNIT$=CHR$(230)+"sec" ELSE UNIT$="msec"
  122. 1033 IF UNIT$<>"msec" THEN TL=TL*1000 : TH=TH*1000 : PERIOD=PERIOD*1000
  123. 1035 UNIT$=" "+UNIT$
  124. 1041 ' Print results
  125. 1045 RSF.N = 3  ' We will be rounding to 3 sig. figs.
  126. 1047 RSF.X = FREQ : GOSUB 40000
  127. 1049 LOCATE 11,45 : PRINT STRING$(35," ")
  128. 1050 LOCATE 11,45 : PRINT "Frequency   ";RSF.X$;" Hz";
  129. 1052 RSF.X = 100*(TH/PERIOD) : GOSUB 40000
  130. 1053 LOCATE 12,45 : PRINT STRING$(35," ")
  131. 1054 LOCATE 12,45 : PRINT "Duty cycle  ";RSF.X$;" % high";
  132. 1057 RSF.X = PERIOD : GOSUB 40000
  133. 1059 LOCATE 14,45 : PRINT STRING$(35," ")
  134. 1060 LOCATE 14,45 : PRINT "Period           ";RSF.X$;UNIT$  ;
  135. 1067 RSF.X = TH : GOSUB 40000
  136. 1069 LOCATE 15,45 : PRINT STRING$(35," ")
  137. 1070 LOCATE 15,45 : PRINT "Duration (high)  ";RSF.X$;UNIT$  ;
  138. 1077 RSF.X = TL : GOSUB 40000
  139. 1079 LOCATE 16,45 : PRINT STRING$(35," ")
  140. 1080 LOCATE 16,45 : PRINT "Duration (low)   ";RSF.X$;UNIT$  ;
  141. 1099 ' Prompt for another try
  142. 1100 LOCATE 25,1 : PRINT STRING$(79," ");
  143. 1110 LOCATE 25,1 : PRINT  "Another?  (Press Y or N)";
  144. 1120 R$=INKEY$ : IF R$="" THEN 1120
  145. 1130 IF R$="Y" OR R$="y" THEN 800
  146. 1140 IF R$<>"N" AND R$<>"n" THEN BEEP: GOTO 1120
  147. 1150 LOCATE 23,1 : KEY ON
  148. 1200 END
  149. 1300 '
  150. 1400 '
  151. 2000 GOTO 800
  152. 40000 '  RSFCONV -- Round to a specified number of significant
  153. 40010 '             digits and convert to a string
  154. 40020 '
  155. 40030 '  Michael A. Covington         7/9/83
  156. 40040 '  Copyright 1983
  157. 40050 '  All rights reserved
  158. 40060 '
  159. 40070 '  Accepts:  rsf.x  -- number to be converted
  160. 40080 '            rsf.n  -- desired number of significant digits
  161. 40090 '
  162. 40100 ' Returns:  rsf.x$ -- number converted to string
  163. 40110 '
  164. 40120 ' Return E format numbers without further processing
  165. 40130 RSF.Y$=STR$(RSF.X)
  166. 40140 IF INSTR(RSF.Y$,"E")>0 THEN RSF.X$=RSF.Y$ : RETURN
  167. 40150 '
  168. 40160 ' Apply correction to produce rounding rather than truncation
  169. 40170 RSF.ABSVAL = ABS(RSF.X)
  170. 40180 RSF.EXP=15
  171. 40190 WHILE 10^RSF.EXP > RSF.ABSVAL : RSF.EXP=RSF.EXP-1 : WEND
  172. 40200 RSF.EXP=RSF.EXP+1-RSF.N
  173. 40210 RSF.CORR = SGN(RSF.X) * .5 * 10^RSF.EXP
  174. 40220 RSF.Y$=STR$(RSF.X + RSF.CORR)
  175. 40230 '
  176. 40240 RSF.X$ = ""
  177. 40250 RSF.FIGCOUNT=0
  178. 40260 '
  179. 40270 ' Transfer digits into new string one by one
  180. 40280 IF RSF.FIGCOUNT = RSF.N THEN 40350
  181. 40290 RSF.PICK$ = LEFT$(RSF.Y$,1)   ' left most character
  182. 40300 RSF.Y$ = MID$(RSF.Y$,2)       ' remainder
  183. 40310 IF RSF.PICK$ = " " THEN 40280
  184. 40320 IF RSF.PICK$="." OR RSF.PICK$="-" THEN RSF.X$=RSF.X$+RSF.PICK$ : GOTO 40280
  185. 40330 RSF.X$=RSF.X$+RSF.PICK$ : RSF.FIGCOUNT=RSF.FIGCOUNT+1 : GOTO 40280
  186. 40340 '
  187. 40350 ' Right number of significant digits have now been processed.
  188. 40360 ' Do any trailing zeroes need to be added?
  189. 40370 RSF.ABSVAL = ABS(RSF.X + RSF.CORR)
  190. 40380 WHILE 10^RSF.FIGCOUNT <= RSF.ABSVAL
  191. 40390   RSF.X$=RSF.X$ + "0"
  192. 40400   RSF.FIGCOUNT = RSF.FIGCOUNT+1
  193. 40410 WEND
  194. 40420 '
  195. 40430 RETURN
  196.